/*
 * @Author: 橘子
 * @Date: 2022-11-26 10:45:08
 * @Project_description: 公共方法
 * @Description: 代码是我抄的，不会也是真的
 */

import store from '@/store/index'

let fun = {}
/**
 * @desc:  给数组增加一个 _each的方法用来做同步循环
 * @return {*}
 * @Author: 橘子
 */
fun.js_each = function() {
  Array.prototype._each = async function(callback, args) {
    const _arr = this, // 因为调用的方式 [1,2,3].asyncForEach this指向数组
      isArray = Array.isArray(_arr), //判断调用者是不是数组
      _args = args ? Object(args) : window //对象化
    if (!isArray) {
      throw new TypeError('当前不是数组!')
    }
    for (let i = 0; i < _arr.length; i++) {
      await callback.call(_args, _arr[i], i)
    }
  }
}

/**
 * @desc: 支持async await
 * @param {fun} promise 需要同步的函数
 * @return {Array}
 * @Author: 橘子
 */
fun.js_to = function(promise) {
  return promise
    .then((data) => [null, data])
    .catch((error) => {
      store.dispatch('d2admin/log/push', {
        message: '调用接口异常',
        type: 'danger',
        meta: {
          error,
        },
      })
      return [error, undefined]
    })
}

/**
 * @desc: json转url对象
 * @param {*} data 对象json
 * @param {*} isPrefix 是否带？
 * @param {*} arrayFormat 数组处理方式 不用理
 * @return {*}
 * @Author: 橘子
 */
fun.js_toParams = function(data = {}, isPrefix = true, arrayFormat = 'brackets') {
  let prefix = isPrefix ? '?' : ''
  let _result = []
  if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'
  for (let key in data) {
    let value = data[key]
    // 去掉为空的参数
    if (['', undefined, null].indexOf(value) >= 0) {
      continue
    }
    // 如果值为数组，另行处理
    if (value.constructor === Array) {
      switch (arrayFormat) {
        case 'indices':
          for (let i = 0; i < value.length; i++) {
            _result.push(key + '[' + i + ']=' + value[i])
          }
          break
        case 'brackets':
          value.forEach((_value) => {
            _result.push(key + '[]=' + _value)
          })
          break
        case 'repeat':
          value.forEach((_value) => {
            _result.push(key + '=' + _value)
          })
          break
        case 'comma':
          let commaStr = ''
          value.forEach((_value) => {
            commaStr += (commaStr ? ',' : '') + _value
          })
          _result.push(key + '=' + commaStr)
          break
        default:
          value.forEach((_value) => {
            _result.push(key + '[]=' + _value)
          })
      }
    } else {
      _result.push(key + '=' + value)
    }
  }
  return _result.length ? prefix + _result.join('&') : ''
}
// 调用一下_each
fun.js_each()
export default fun
